#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "spi_flash_mmap.h"
#include "esp_mac.h"

/* 任务传参 */

typedef struct A_STRUCT
{
    int a;
    int b;
} xStruct;

xStruct xStruct1 = {100, 200};

static const char *pcTxt = "hello";

void myTask(void *pvParameters)
{
    // 例子1 转换成int类型指针
    // int *pInt;
    // pInt = (int *)pvParameters; // 强制转换为 int 类型指针

    // 例子2 转换成 数组 类型指针
    // int *pArrayAddr;
    // pArrayAddr = (int *)pvParameters; // 强制转换为 数组 类型指针

    // 例子3 转换成 结构体 类型指针
    // xStruct *pStruct;
    // pStruct = (xStruct *)pvParameters; // 强制转换为 结构体 类型指针
    // printf("pStruct->a = %d\n", pStruct->a);
    // printf("pStruct->b = %d\n", pStruct->b);

    // 例子4 转换成 字符串 类型指针
    char *pTxt;
    pTxt = (char *)pvParameters; // 强制转换为 字符串 类型指针
    printf("pTxt = %s\n", pTxt);

    // 通过节拍器延时1s
    // 注意：vTaskDelay()函数的参数是一个节拍数，而不是毫秒数。
    // 要将毫秒数转换为节拍数，可以使用pdMS_TO_TICKS()宏。
    vTaskDelay(pdMS_TO_TICKS(1000));
    // 完成后删除任务
    vTaskDelete(NULL);
}

int testNum = 1;
int testArr[] = {1, 2, 3, 4, 5};

void app_main(void)
{
    // 例子1 创建任务，传入整形变量
    // xTaskCreate(myTask, "myTask", 2048, (void *)testArr, 1, NULL);

    // 例子2 创建任务，传入数组变量
    // xTaskCreate(myTask, "myTask", 2048, (void *)&testNum, 1, NULL);

    // 例子3 创建任务，传入结构体变量
    // xTaskCreate(myTask, "myTask", 2048, (void *)&xStruct1, 1, NULL);

    // 例子4 创建任务，传入字符串变量
    xTaskCreate(myTask, "myTask", 2048, (void *)pcTxt, 1, NULL);
}
